有符号十六进制转十进制 c++

实践中遇到有符号十六进制数需要转化成十进制数,编程如下,如有疏漏,恳请指出。

int hextode(char* hex)
{
    if(hex ==NULL)
        return 0;
    char binary[17]={0};//放二进制字符串
    char* hexstr="006C";//一个16进制字符串
    //Convert strings to a long-integer value.
    long i32=strtol(hexstr,NULL,16);//读取16进制的值
    cout<<i32<<endl;

    int toint = 0;
    int ratio = 1;
    if(hexstr[0]>'8')
    {
       cout<<"此数为负"<<endl;
       //Converts an integer to a string
       itoa(i32,binary,2);/*输出为二进制*/
       for(int i=0;i<16;i++) 
          cout<<binary[i];
       cout<<endl;
       cout<<' ';
       for(int i=1;i<16;i++) //除第一位外取反
            {
             binary[i] ='0'+!(binary[i]-'0');
             cout<<binary[i];
       }
       cout<<endl;
       int nTakeover = 0;
       bool isoverflow = false;
       for(int i=15;i>=0;i--) //二进制加1
       {
          int nsum = binary[i]-'0'+nTakeover; //每位加上进位
          if(i==15)
              nsum++;
          if(nsum==2)
              {
                  if(i == 0)
                      isoverflow = true;
                  else
                  {
                  nsum-=2;
                  nTakeover = 1;
                  binary[i] = '0'+nsum;
                  }
              }
          else
          {
          binary[i] = '0'+nsum;
          break;
          }
       } 
       for(int i=0;i<16;i++) //取反加一后
            {
             cout<<binary[i];
       }
       cout<<endl;
       for(int j=15;j>0;--j)
       {
         toint = toint+ (binary[j]-'0')*ratio;
         ratio=ratio*2;
       }    
       toint = toint*(-1);
       cout<<toint<<endl;
       return toint;
    }
    else
    {
       cout<<"此数为正"<<endl;
       toint= i32;
       cout<<toint<<endl;
       return toint;
    }
}
C++中,使用IEEE 754标准将十六进制浮点数换成十进制,你需要了解如何解析这个特定的二进制格式。以下是基本步骤,但请注意,实际的库函数(如std::stof或bitset)可能更方便: ```cpp #include <iostream> #include <bitset> // 将IEEE 754双精度浮点数的十六进制字符串换为十进制 double hexToDecimal(const std::string& hexStr) { // IEEE 754双精度浮点数分为三部分:符号、指数和尾数 size_t signStart = 0; if (hexStr[0] == '-') { signStart = 1; // 签位在第一位 } // 指数部分 size_t exponentStart = signStart + 1; size_t exponentLength = 11; // IEEE 754 double的指数总长度(11位二进制,化为10位十六进制) size_t exponentEnd = exponentStart + exponentLength; // 尾数部分 size_t fractionStart = exponentEnd; size_t fractionLength = 52; // IEEE 754 double的尾数总长度 // 分离并换每个部分 int sign = hexStr[signStart] == '-' ? -1 : 1; uint64_t exponent = static_cast<uint64_t>(stoi(hexStr.substr(exponentStart, exponentLength), nullptr, 16)); uint64_t fraction = static_cast<uint64_t>(std::stoull(hexStr.substr(fractionStart, fractionLength), nullptr, 16)); // 根据二进制形式计算十进制值 double result = sign * pow(2.0, exponent - 1023) * (1 + ((fraction << 1) & 0x1p+52)); // 移位并调整尾数 return result; } int main() { std::string hexFloat = "0x1.fffffffffffffp-1022"; // 示例十六进制字符串 double decimalValue = hexToDecimal(hexFloat); std::cout << "Hex to Decimal: " << decimalValue << std::endl; return 0; } ``` 这个代码示例展示了如何手动解析,如果涉及到大量换,推荐使用现有的库函数来简化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值